import { asyncRoutes, constRoutes } from "@/router";

/**
 * 根据路由meta.role确定是否当前用户有权限访问该路由
 * @param roles 用户角色
 * @param route 路由信息，待判断是否可访问
 */
function hasPermission(roles, route) {
    // 如果路由meta中有roles字段，则表示该路由需要roles权限才能访问
    if (route.meta && route.meta.roles) {
        // 判断用户角色是否在路由meta.roles中
        return roles.some(role => route.meta.roles.includes(role))
    } else {
        // 如果路由meta中没有roles字段，则表示该路由不需要权限即可访问
        return true
    }
}

/**
 * 递归过滤异步路由表（AsyncRoutes），返回符合用户角色权限的路由表
 * @param routes 异步路由表
 * @param roles 用户角色 * 
 */
export function filterAsyncRoutes(routes, roles) {
    const res = [];
    routes.forEach(route => {
        const tmp = { ...route };
        if (hasPermission(roles, tmp)) {
            if (tmp.children) {
                tmp.children = filterAsyncRoutes(tmp.children, roles)
            }
            res.push(tmp)
        }
    })
    return res
}

const state = {
    routes: [],  // 所有路由,包括静态路由和动态路由
    addRoutes: [],  // 动态添加的路由,即根据用户角色动态生成的路由    
    
}

const mutations = {
    SET_ROUTES: (state, routes) => {
        state.addRoutes = routes;
        state.routes = constRoutes.concat(routes)
    }
}

const actions = {
    // 根据用户角色生成可访问的路由表  
    generateRoutes({ commit }, roles) {
        // console.log('per',roles);
        
        return new Promise(resolve => {
            let accessedRoutes;
            // 用户是管理员，则拥有所有路由权限
            if (roles.includes("admin")) {
                accessedRoutes = asyncRoutes || []
                // console.log('123',accessedRoutes);
                
            } else {
                // 根据用户角色过滤异步路由表
                accessedRoutes = filterAsyncRoutes(asyncRoutes, roles)
            }
            commit("SET_ROUTES", accessedRoutes);
            resolve(accessedRoutes);
        })
    }
}

export default {
    namespaced: true,    
    state,
    mutations,
    actions
}